package com.zc58s.lock;

import java.util.concurrent.locks.AbstractQueuedSynchronizer;

/**
 * @author Fox
 */
public class TulingLock extends AbstractQueuedSynchronizer {

    /**
     * 加锁逻辑，需要自己实现的
     *
     * @param unused
     * @return
     */
    @Override
    protected boolean tryAcquire(int unused) {
        //cas 加锁  state=0
        // 多个线程来了之后，只能一个线程改成功
        if (compareAndSetState(0, 1)) {
            //设置当前线程，设置为独占状态
            setExclusiveOwnerThread(Thread.currentThread());
            return true;
        }
        return false;
    }

    /**
     * 释放锁逻辑
     *
     * @param unused
     * @return
     */
    @Override
    protected boolean tryRelease(int unused) {
        //释放锁，此处没有使用CAS，为什么？
        //没必要，加锁，解锁是成对出现的，在没有释放锁之前的所有操作，都是属于这个线程
        setExclusiveOwnerThread(null);
        setState(0);
        return true;
    }

    public void lock() {
        acquire(1);
    }

    public boolean tryLock() {
        return tryAcquire(1);
    }

    public void unlock() {
        release(1);
    }

    public boolean isLocked() {
        return isHeldExclusively();
    }


}